package top.jiangyixin.spring;

import org.springframework.beans.factory.support.BeanDefinitionReader;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import top.jiangyixin.spring.bean.Student;

/**
 * Ioc Inverse of Control
 * Di Dependency Injection
 *
 * Spring容器管理Bean的过程以及加载模式
 * 1. 需要将bean的定义信息声明在Spring的配置文件中
 * 2. 需要通过Spring抽象出的各种Resource来指定对应的配置文件
 * 3. 需要显式声明一个Spring工厂，改工厂用来掌控在配置文件中所声明的bean以及bean之间的依赖关系和注入关系
 * 4. 需要定义一个配置信息读取器，该读取器用来读取之前定义bean配置文件信息，读取器的作用是读取我们声明的配置文件信息，并且将读取后的信息装配到之前声明的工厂当中
 * 5. 需要将读取器与工厂以及资源进行相应的关联处理
 * 6. 工厂所管理的全部对象全部装配完毕，可供客户端直接调用，获取客户端所需要的各种bean对象
 *
 * Spring 对于bean管理的核心组件
 * 1. 资源抽象
 * 2. 工厂
 * 3. 配置信息读取器
 *
 * @author jiangyixin
 * @version 1.0
 * @date 2021/7/27 上午8:54
 */
public class SpringClient {
    public static void main(String[] args) {
        Resource resource = new ClassPathResource("applicationContext.xml");
        DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
        BeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
        reader.loadBeanDefinitions(resource);
        Student student = (Student) beanFactory.getBean("student");
        System.out.println(student);
    }
}
